# 短信验证码
# 验证码工具类
# 验证码需要随机生成 所以导入随机库
import random
# 导入redis库
import redis
# 导入数据库得模块
from db import databases
# 导入datatime库
import datetime
# 时间库 time  秒级时间
import  time

#定义验证码类
class Code:

    def __init__(self):

        # 声明redis链接
        self.r = redis.Redis()


        # 生成一个随机四位字符串
        code = ''
        # 定义随机字符
        source = '0123456789'
        for i in range(4):
            # 从用户体验将  四位不多不少 既能保证安全性，又能提高用户体验
            # 获取随机码         随机获取长度  随机码长度
            tmp_num = random.randrange(len(source))
            code += source[tmp_num]

        self.code = code


    # 验证码逻辑 mysql
    def send_code_mysql(self,phone):
        sql = "select `code`,`date` from code where `phone` = '%s'" % phone
        res = databases.get_one(sql)
        # print(res)

        # 获取当前系统得时间  然后进行格式化时间
        dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")


        #两种情况 找到 说明曾经发给
        if res:
            # 判断时间差  时间差：当前得时间-发验证码得时间

            mysql_dt = res['date']

            # 获取秒级时间  当前
            sencnod_time = time.time()
            # print(sencnod_time)

            minus = sencnod_time - mysql_dt.timestamp()
            if int(minus) < 30:
                return "您在30秒内只能发送一条验证码"
            else:
                # 删除过期的验证码
                databases.delete("delete from `code` where phone='%s'" %phone)

                # 立刻发送一条验证码
                databases.insert("insert into `code` (`code`,`phone`,`date`) values ('%s','%s','%s')" %(self.code,phone,dt))
                return  "您的验证码已经发送"
        else:
            # 立刻发送一条验证码
            databases.insert("insert into `code` (`code`,`phone`,`date`) values ('%s','%s','%s')" % (self.code, phone, dt))
            return "您的验证码已经发送"

    # 发送验证码
    def send_code(self,phone):

        # 判断两种情况  一种是没发   一种是发了存在在redis中不能再发
        code = self.r.get(phone)
        # 获取到
        if code:
            return "您30秒内只能发送一条验证码"
        else:
            # 存储验证码
            self.r.set(phone,self.code)
            # 声明验证码得声明周期
            self.r.expire(phone,30)
            self.r.get(self.code)
            return self.code


# 看redis 验证码得声明周期 ttl 手机号
code = Code()
# print(code.send_code('123416548'))
# print(code.send_code_mysql('123123'))


# jwt 生成
import jwt
# 密钥类
class MyJwt:

    def __init__(self):
        # 初始化密钥
        self.password = '123'

    # 加密
    def encode_jwt(self,userinfo):
                          # 用户信息   密钥           算法
        mystr = jwt.encode(userinfo, self.password, algorithm='HS256')
        try:
            mystr = str(mystr,'utf-8')
        except Exception as e:
            # print(e)
            pass
        return mystr

    #解密
    def decode_jwt(self,mystr):
        return jwt.decode(mystr,self.password,algorithms=['HS256'])


myjwt = MyJwt()

# encode_jwt = myjwt.encode_jwt({'id':'1'})
# print(myjwt.decode_jwt(encode_jwt)['id'])
